001 /*
002 * Created by IntelliJ IDEA.
003 * User: Wei Wang
004 * Date: 2002-9-6
005 * Time: 15:53:41
006 * To change template for new class use
007 * Code Style | Class Templates options (Tools | IDE Options).
008 */
009 package EVolve.util.overlappers;
010
011 import EVolve.visualization.*;
012 import EVolve.visualization.VizFactory.VisualizationFactory;
013 import EVolve.visualization.XYViz.XYVisualization;
014 import EVolve.Scene;
015 import EVolve.util.predefinedutils.*;
016 import EVolve.util.unifyutils.Unification;
017 import EVolve.exceptions.NoDataPlotException;
018 import EVolve.exceptions.EVolveException;
019
020 import javax.swing.*;
021 import javax.swing.filechooser.FileSystemView;
022 import java.awt.*;
023 import java.awt.event.*;
024 import java.io.*;
025 import java.util.*;
026
027 public class AsynchronousOverlapper extends OverlapVisualization {
028 private final String name = "AsynchronousOverlapper";
029 private JList fileList,procList;
030 private JTextField txtConfName;
031 private HashSet setFile;
032 private ArrayList setProcessFiles;
033 private DefaultListModel procListModel,fileListModel;
034 private ArrayList[] entityList;
035 private ArrayList[] referenceDimList;
036
037 public AsynchronousOverlapper() {
038 super();
039 dialog = null;
040 setProcessFiles = new ArrayList();
041 setFile = new HashSet();
042 colorList = new ArrayList();
043 entityList = new ArrayList[2];
044 entityList[0] = new ArrayList();
045 entityList[1] = new ArrayList();
046 referenceDimList = new ArrayList[2];
047 referenceDimList[0] = new ArrayList();
048 referenceDimList[1] = new ArrayList();
049 }
050
051 public String getName() {
052 return name;
053 }
054
055 public void createDialog() {
056 setFile.clear();
057 setProcessFiles.clear();
058 colorList.clear();
059 visualizationList.clear();
060 dialog = new JDialog(Scene.getFrame(),"Overlap Visualizations...",true);
061 dialog.setBounds(new Rectangle(500,400));
062
063 JPanel batchName = new JPanel(new FlowLayout());
064 dialog.getContentPane().add(batchName,BorderLayout.NORTH);
065
066 Box boxMain = new Box(BoxLayout.Y_AXIS);
067 boxMain.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(),
068 "Choose data source(s) to be overlapped & Processing configuration"));
069 dialog.getContentPane().add(boxMain,BorderLayout.CENTER);
070
071
072 Box boxLabels = new Box(BoxLayout.X_AXIS);
073 JButton buttonGetDir = new JButton("Select Directory ..");
074 buttonGetDir.addActionListener(new ActionListener(){
075 public void actionPerformed(ActionEvent e){
076 fillFileList();
077 }
078 });
079 boxLabels.add(buttonGetDir);
080 boxLabels.add(Box.createHorizontalGlue());
081 boxLabels.add(new JLabel("Processing List "));
082
083 Box boxLists = new Box(BoxLayout.X_AXIS);
084 fileListModel = new DefaultListModel();
085 fileList = new JList(fileListModel);
086
087 Box boxAddRemove = new Box(BoxLayout.Y_AXIS);
088 JButton buttonAdd = new JButton(" > ");
089 buttonAdd.addActionListener(new ActionListener(){
090 public void actionPerformed(ActionEvent e){
091 addFiles();
092 }
093 });
094 JButton buttonRemove = new JButton(" < ");
095 buttonRemove.addActionListener(new ActionListener(){
096 public void actionPerformed(ActionEvent e){
097 removeFiles();
098 }
099 });
100 boxAddRemove.add(Box.createVerticalStrut(40));
101 boxAddRemove.add(buttonAdd);
102 boxAddRemove.add(Box.createVerticalStrut(20));
103 boxAddRemove.add(buttonRemove);
104
105 procListModel = new DefaultListModel();
106 procList = new JList(procListModel);
107
108 JScrollPane scrollPane1 = new JScrollPane(fileList);
109 JScrollPane scrollPane2 = new JScrollPane(procList);
110 boxLists.add(scrollPane1);
111 boxLists.add(boxAddRemove);
112 boxLists.add(scrollPane2);
113
114 boxMain.add(boxLabels);
115 boxMain.add(Box.createVerticalStrut(5));
116 boxMain.add(boxLists);
117
118 Box boxConfig = new Box(BoxLayout.X_AXIS);
119 boxConfig.add(new JLabel("Choose configure file:"));
120 txtConfName = new JTextField(12);
121 boxConfig.add(Box.createHorizontalStrut(20));
122 boxConfig.add(txtConfName,BorderLayout.CENTER);
123 JButton buttonConfig = new JButton("...");
124 buttonConfig.addActionListener(new ActionListener(){
125 public void actionPerformed(ActionEvent e){
126 txtConfName.setText(chooseConfig());
127 }
128 });
129 boxConfig.add(buttonConfig,BorderLayout.EAST);
130
131 Box boxOkCancel = new Box(BoxLayout.X_AXIS);
132 JButton buttonOK = new JButton("OK");
133 JButton buttonCancel = new JButton("Cancel");
134 JButton buttonColor = new JButton("Coloring");
135
136 buttonOK.addActionListener(new ActionListener(){
137 public void actionPerformed(ActionEvent e){
138 onOK();
139 }
140 });
141 buttonCancel.addActionListener(new ActionListener(){
142 public void actionPerformed(ActionEvent e){
143 onCancel();
144 }
145 });
146 buttonColor.addActionListener(new ActionListener(){
147 public void actionPerformed(ActionEvent e){
148 selectColor();
149 }
150 });
151
152 boxOkCancel.add(Box.createHorizontalStrut(25));
153 boxOkCancel.add(buttonColor);
154 boxOkCancel.add(Box.createHorizontalStrut(20));
155 boxOkCancel.add(buttonOK);
156 boxOkCancel.add(Box.createHorizontalStrut(20));
157 boxOkCancel.add(buttonCancel);
158
159 Box boxBottom = Box.createVerticalBox();
160 boxBottom.add(Box.createVerticalStrut(12));
161 boxBottom.add(boxConfig);
162 boxBottom.add(Box.createVerticalStrut(30));
163 boxBottom.add(boxOkCancel);
164
165
166 dialog.getContentPane().add(boxBottom,BorderLayout.SOUTH);
167 //dialog.setResizable(false);
168
169 }
170
171 private void selectColor() {
172 int index = procList.getSelectedIndex();
173
174 if (index != -1) {
175 Color newColor = JColorChooser.showDialog(Scene.getFrame(), "Choose a color", Color.black);
176 if (newColor != null) {
177 colorList.add(index,newColor);
178 colorList.remove(index+1);
179 procListModel.removeAllElements();
180
181 for (int i=0; i<setProcessFiles.size(); i++) {
182 if (colorList.get(i) == null)
183 procListModel.addElement(setProcessFiles.get(i));
184 else
185 procListModel.addElement("<html><font color=#" + getColorHex((Color)colorList.get(i)) + ">"
186 + setProcessFiles.get(i) +" </font></html>" );
187 }
188 }
189 }
190 }
191
192 private void onOK() {
193
194 if (procListModel.size() < 2) {
195 Scene.showErrorMessage("Please select at least 2 data source.");
196 return;
197 }
198
199 if (txtConfName.getText().trim().length() == 0) {
200 Scene.showErrorMessage("No configuration file selected!");
201 return;
202 }
203 dialog.setVisible(false);
204 noEntityAvailable = false;
205
206 overlappedVisualize();
207 }
208
209 private void onCancel() {
210 dialog.setVisible(false);
211 }
212
213 private void addFiles() {
214 int[] selectIndex = fileList.getSelectedIndices();
215 ArrayList newColorList = new ArrayList();
216
217 for (int i=0;i<selectIndex.length;i++) {
218 if (setProcessFiles.contains(fileListModel.getElementAt(selectIndex[i]))) continue;
219
220 setProcessFiles.add(fileListModel.getElementAt(selectIndex[i]));
221 procListModel.addElement(fileListModel.getElementAt(selectIndex[i]));
222 }
223
224 for (int i=0; i<setProcessFiles.size();i++) {
225 if (i<colorList.size())
226 newColorList.add(i,colorList.get(i));
227 else
228 newColorList.add(i,null);
229 }
230 colorList = newColorList;
231 }
232
233 private void removeFiles() {
234 int[] selectIndex = procList.getSelectedIndices();
235
236 for (int i=selectIndex.length -1 ;i>=0;i--) {
237 setProcessFiles.remove(selectIndex[i]);
238 colorList.remove(selectIndex[i]);
239 procListModel.removeElement(procListModel.getElementAt(selectIndex[i]));
240 }
241 }
242
243 private String chooseConfig() {
244 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastConfigDir());
245
246 if(fc.showOpenDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
247 File f = fc.getSelectedFile();
248 Scene.getUIManager().setLastConfigDir(f.getPath());
249 return (f.getPath());
250 }
251 else return "";
252 }
253
254 private void fillFileList() {
255 JFileChooser fc = new JFileChooser(Scene.getUIManager().getLastDataDir());
256 String path;
257
258 fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
259
260 fileListModel.removeAllElements();
261 if(fc.showOpenDialog(Scene.getFrame()) == JFileChooser.APPROVE_OPTION) {
262 path = fc.getSelectedFile().getAbsolutePath();
263 Scene.getUIManager().setLastDataDir(path);
264 File dir = new File(path);
265 FileSystemView fv = fc.getFileSystemView();
266 File[] fl = fv.getFiles(dir,false);
267 for (int i=0;i<fl.length;i++) {
268 String fn = fl[i].getName();
269 if (!fl[i].isFile() || !fn.endsWith(".dat") || setFile.contains(path+File.separator+fn))
270 continue;
271 setFile.add(path+File.separator+fn);
272 fileListModel.addElement(/*path+File.separator+*/fn);
273 }
274 }
275
276 }
277
278 public boolean isOverlapable(Visualization visualToBeOverlapped) {
279 return true;
280 }
281
282 public void preOverlappedVisualize() throws EVolveException{
283 String dataSource;
284 VizInfo vizInfo = null;
285 HashMap mapConfig = new HashMap();
286 Visualization visual;
287
288 reset();
289 for (int i=0; i<procListModel.size(); i++) {
290 dataSource = (String)setProcessFiles.get(i);
291 Scene.setDataFilename(dataSource);
292 Scene.autoLoadDataSource();
293
294 if (i == 0) {
295 SerializerInfo info = VisualizationSerializer.v().getVizInfoFromDisk(txtConfName.getText().trim());
296 vizInfo = (VizInfo)info.vizInfoList.get(0);
297 }
298
299 mapConfig.put("Factory",vizInfo.getFactory());
300 mapConfig.put("Subject",vizInfo.getSubject());
301 mapConfig.put("Dimension",vizInfo.getDimension());
302 mapConfig.put("Predictor",vizInfo.getPredictor());
303 mapConfig.put("Interval",new Integer(vizInfo.getInterval()));
304 mapConfig.put("BeginCall",new Long(vizInfo.getBeginCall()));
305 mapConfig.put("EndCall",new Long(vizInfo.getEndCall()));
306
307 visual = Scene.getVisualizationManager().newVisualization(((VisualizationFactory)mapConfig.get("Factory")).getName());
308
309 visual.setName(vizInfo.getTitle());
310 visual.autoUpdateConfiguration(mapConfig);
311 visualizationList.add(visual);
312
313 Scene.getVisualizationManager().addAllVisualizations();
314 Scene.getVisualizationManager().prepareListToBeVisualized();
315 Scene.autoVisualize();
316
317 for (int k=0; k< entityList.length; k++)
318 if (vizInfo.getDimension()[k] instanceof ReferenceDimension) {
319 entityList[k].add(Scene.getDataManager().getEntity()[vizInfo.getDimension()[k].getDataFilter().getTargetType()]);
320 referenceDimList[k].add(visual.getDimension()[k]);
321 }
322 }
323
324 }
325
326 public void overlappedVisualize() {
327 Visualization visual;
328
329 Scene.getVisualizationManager().init();
330 Scene.getUIManager().init();
331
332 if (window instanceof EVolve.Window) {
333 Scene.getUIManager().removeWindow(window);
334 window = null;
335 }
336 visualizationList.clear();
337 Scene.getUIManager().setDoNotRemoveWindow(true);
338 try {
339 preOverlappedVisualize();
340 } catch (EVolveException e) {
341 Scene.showErrorMessage(e.getMessage());
342 Scene.getUIManager().setDoNotRemoveWindow(false);
343 Scene.setDataFilename(null);
344 return;
345 }
346 Scene.getUIManager().setDoNotRemoveWindow(false);
347 Scene.setDataFilename(null);
348
349
350 unifyVisualizations();
351
352 // begin drawing overlap
353 if (window instanceof EVolve.Window) {
354 Scene.getUIManager().removeWindow(window);
355 window = null;
356 }
357
358 newOverlappedVisualization(this);
359
360 int [] selectedIndex = new int[2];
361 int [] sortedDimension = new int[2];
362 visual = (Visualization)visualizationList.get(0);
363
364 for (int i=0; i<fullEntitySet.length; i++) {
365 if (visual.getDimension()[i] instanceof ReferenceDimension) {
366
367 selectedIndex[i] = ((ReferenceDimension)visual.getDimension()[i]).getSelectedComparatorIndex();
368 sortedDimension[i] = 1;
369 break;
370 }
371 }
372
373 sort();
374 enableSortMenu();
375 }
376
377 private void unifyVisualizations() {
378 // now we begin unify all entities
379 HashMap standard[] = new HashMap[2];
380 standard[0] = new HashMap();
381 standard[1] = new HashMap();
382
383 for (int i=0; i<entityList.length; i++) {
384 for (int j=0; j<entityList[i].size(); j++) {
385 Unification.unifyEntities(standard[i],(HashMap)entityList[i].get(j));
386 }
387 }
388
389 // dump the unified entities into a hashset
390 for (int i=0; i<standard.length; i++) {
391 Iterator it = standard[i].keySet().iterator();
392 fullEntitySet[i] = new HashSet();
393 while (it.hasNext()) {
394 fullEntitySet[i].add(standard[i].get(it.next()));
395 }
396 }
397 // unifying entities done here
398
399 Visualization visual;
400 for (int i=0; i<entityList.length; i++) {
401 if (entityList[i].size() == 0) continue; // not a reference dimension
402 for (int j=0; j<visualizationList.size(); j++) {
403 visual = (Visualization)visualizationList.get(j);
404
405 ReferenceDimension dim = visual.getLinkableDimension(i);
406 Color newColor = (Color)colorList.get(j);
407 Unification.changeColor(visual.getImage(),newColor);
408
409 dim.linkEntities(fullEntitySet[i]);
410 try {
411 dim.visualize();
412 } catch (NoDataPlotException e) {
413 Scene.showErrorMessage(e.getMessage());
414 }
415 ((XYVisualization)visual).disablePopupMenu();
416 }
417 }
418 }
419
420 private void reset() {
421 fullEntitySet = new HashSet[2];
422 fullEntitySet[0] = null;
423 fullEntitySet[1] = null;
424 for (int i= 0; i<entityList.length ; i++) {
425 entityList[i].clear();
426 }
427 }
428 }